package com.softme.trade.i18n;

import java.text.MessageFormat;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;

import com.softme.trade.model.User;
import com.softme.trade.view.util.FacesUtil;

public class I18nUtils
{
	private static Map<Locale, ResourceBundle> bundleMap = new HashMap<Locale, ResourceBundle>();

	private final static String BASE_NAME = "com.softme.trade.i18n.entries";
	
	//**********************************************************************
	//TODO Necessário alterar para en_US assim que for liberado para cliente
	//**********************************************************************
	private final static String DEFAULT_LANGUAGE = "pt_BR";

	private static ResourceBundle getBundle(Locale locale) throws Exception
	{
		ResourceBundle bundleCached = bundleMap.get(locale);

		//Significa que é a primeira vez que carrega o bundle
		//para esse idioma
		if (bundleCached == null)
		{
			bundleCached = ResourceBundle.getBundle(BASE_NAME, locale);

			if (bundleCached != null)
			{
				//coloca na memória
				bundleMap.put(locale, bundleCached);
			}
			else
				return getDefaultBundle();
		}

		return bundleCached;
	}

	private static ResourceBundle getDefaultBundle() throws Exception
	{
		ResourceBundle defaultBundle = ResourceBundle.getBundle(BASE_NAME, new Locale(DEFAULT_LANGUAGE));
		
		if (defaultBundle == null)
			throw new Exception("Bundle não encontrado para o locale especificado");
		
		return defaultBundle;
	}
	
	/** Função que retorna o locale corrente de acordo com o usuário
	 *  que está na sessão.
	 * 
	 * @return Locale
	 */
	public static Locale getCurrentLocale()
	{
		User currentUser = FacesUtil.getCurrentUser();
		
		if  (currentUser != null)
			return currentUser.getLocale();
		
		return null;
	}
	
	/**
	 * Retorna a string de acordo com o locale do usuário corrente
	 * 
	 * @param code
	 * @return String value
	 */
	public static String getString(String code)
	{
		return getString(code, getCurrentLocale());
	}

	public static String getString(String code, Locale locale)
	{
		try
		{
			return getBundle(locale).getString(code);
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		return code;
	}

	public static String getMessage(String message, Object... args)
	{
		if (args == null || args.length == 0)
			return getString(message);
		else
		{
			MessageFormat formatter = new MessageFormat(getString(message),	getCurrentLocale());
			return formatter.format(args);
		}
	}
	
}
